package com.lsl.service;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ArrayUtil;
import com.alibaba.fastjson.JSON;
import com.lsl.domain.Architect;
import com.lsl.domain.Designer;
import com.lsl.domain.Employee;
import com.lsl.domain.Printer;
import com.lsl.domain.Programmer;
import com.lsl.utils.Status;
import com.lsl.utils.TeamException;
import javafx.scene.control.TableRow;

import java.util.Arrays;

/**关于开发团队成员的管理：添加、删除等
 * @author lishuailong
 * @create 2020-06-28 16:43
 */
public class TeamService {
    /**
     * 用来为开发团队新增成员自动生成团队中的唯一ID，即memberId。（提示：应使用增1的方式）
     */
    private static  int counter=1;
    /**
     * 表示开发团队最大成员数
     */
    private final int  MAX_MEMBER=5;

    /**
     * 用来保存当前团队中的各成员对象
     */
    private Programmer[] team=new Programmer[MAX_MEMBER];


    /**
     *  记录团队成员的实际人数
     */
    private int total=0;

    /**返回当前团队的所有对象
     * @return programmers
     */
    public  Programmer[] getTeam(){
        Programmer[] programmers=new Programmer[total];
        for (int i = 0; i < total; i++) {
            programmers[i]=team[i];
        }
        return programmers;
    }

    /**向团队中添加成员
     * @param employee
     */
    public void addMember(Employee employee) throws TeamException {

//        成员已满，无法添加
        if (total>=MAX_MEMBER){
            throw new TeamException("成员已满，无法添加");
        }
//        该成员不是开发人员，无法添加
        if (!(employee instanceof Programmer)){
            throw new TeamException("该成员不是开发人员，无法添加");
        }
//        该员工已在本开发团队中
        if (isExist(employee)){
            throw new TeamException("该员工已在本开发团队中");
        }
        Programmer programmer = (Programmer) employee;
//        该员工已是某团队成员
        if (Status.BUSY.getNAME().equals(programmer.getStatus().getNAME())){
            throw new TeamException("该员工已是某团队成员");
        }
//        该员正在休假，无法添加
        if (Status.VOCATION.getNAME().equals(programmer.getStatus().getNAME())){
            throw new TeamException("该员正在休假，无法添加");
        }
        int architectNum=0,designerNum=0,programmerNum=0;
        for (int i = 0; i <total ; i++) {
            Programmer pro = team[i];
            if (pro instanceof Architect){
                architectNum++;
            }else if (pro instanceof Designer){
                designerNum++;
            }else if (pro instanceof Programmer){
                programmerNum++;
            }
        }

        if (programmer instanceof Architect){// 团队中至多只能有一名架构师
            if (architectNum>=1){
                throw new TeamException("团队中至多只能有一名架构师");
            }
        }else if (programmer instanceof Designer){//团队中至多只能有两名设计师
            if (designerNum>=2){
                throw new TeamException("团队中至多只能有两名设计师");
            }
        }else if (programmer instanceof Programmer){//团队中至多只能有三名程序员
            if (programmerNum>=3){
                throw new TeamException("团队中至多只能有三名程序员");
            }
        }
        //设置团队id
        programmer.setMemberId(counter++);
        //设置程序员的状态
        programmer.setStatus(Status.BUSY);
        //向团队中添加成员
        team[total++]= programmer;

    }

    /**是否在开发团队中
     * @param employee
     * @return
     */
    private boolean isExist(Employee employee) {
        for (int i = 0; i <total ; i++) {
            if (team[i].getId()==employee.getId()){
                return true;
            }
        }
        return false;
    }

    /**从团队中删除成员
     * @param memberId
     */
    public void removeMember(int memberId) throws TeamException {
        int i;
        for (i = 0; i <total ; i++) {
            if (team[i].getMemberId()==memberId){
                team[i].setStatus(Status.FREE);
                break;
            }
        }
        if (total==i){
            throw new TeamException("找不到指定memberId的员工，删除失败");
        }
        //删除数组中的元素
        for (int j=i+1;j<total;j++){
            team[j-1]=team[j];
        }
        //删除最后一个元素 && 修改团队的成员数
        team[--total]=null;
    }

    public static void main(String[] args) {
        int[] num = new int[]{1,2,3,4,5,6};

        int i=1;

        for(int j = 2;j < num.length;j++){
            num[j-1] = num[j];
        }
        System.out.println(JSON.toJSONString(num));

    }
}
















